package com.atguigu.schedule.mapper;

import com.atguigu.schedule.pojo.FaceDetectionLog;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 人脸检测日志Mapper接口
 * 
 * @author atguigu
 * @since 2024
 */
@Mapper
public interface FaceDetectionLogMapper {
    
    /**
     * 插入检测日志
     * 
     * @param faceDetectionLog 检测日志
     * @return 影响行数
     */
    int insert(FaceDetectionLog faceDetectionLog);
    
    /**
     * 根据ID查询检测日志
     * 
     * @param id 日志ID
     * @return 检测日志
     */
    FaceDetectionLog selectById(@Param("id") Long id);
    
    /**
     * 根据人员姓名查询检测日志（分页）
     * 
     * @param personName 人员姓名
     * @param offset 偏移量
     * @param limit 限制数量
     * @return 检测日志列表
     */
    List<FaceDetectionLog> selectByPersonNameWithPaging(@Param("personName") String personName,
                                                       @Param("offset") int offset,
                                                       @Param("limit") int limit);
    
    /**
     * 根据检测时间范围查询日志（分页）
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param offset 偏移量
     * @param limit 限制数量
     * @return 检测日志列表
     */
    List<FaceDetectionLog> selectByDetectionTimeBetweenWithPaging(@Param("startTime") LocalDateTime startTime,
                                                                   @Param("endTime") LocalDateTime endTime,
                                                                   @Param("offset") int offset,
                                                                   @Param("limit") int limit);
    
    /**
     * 查询识别成功的检测日志（分页）
     * 
     * @param offset 偏移量
     * @param limit 限制数量
     * @return 检测日志列表
     */
    List<FaceDetectionLog> selectByRecognizedWithPaging(@Param("offset") int offset,
                                                        @Param("limit") int limit);
    
    /**
     * 根据人员姓名和检测时间范围查询日志（分页）
     * 
     * @param personName 人员姓名
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param offset 偏移量
     * @param limit 限制数量
     * @return 检测日志列表
     */
    List<FaceDetectionLog> selectByPersonNameAndDetectionTimeBetweenWithPaging(@Param("personName") String personName,
                                                                               @Param("startTime") LocalDateTime startTime,
                                                                               @Param("endTime") LocalDateTime endTime,
                                                                               @Param("offset") int offset,
                                                                               @Param("limit") int limit);
    
    /**
     * 统计指定时间范围内的检测次数
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 检测次数
     */
    long countByDetectionTimeBetween(@Param("startTime") LocalDateTime startTime,
                                    @Param("endTime") LocalDateTime endTime);
    
    /**
     * 统计指定人员的检测次数
     * 
     * @param personName 人员姓名
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 检测次数
     */
    long countByPersonNameAndDetectionTimeBetween(@Param("personName") String personName,
                                                 @Param("startTime") LocalDateTime startTime,
                                                 @Param("endTime") LocalDateTime endTime);
    
    /**
     * 查询最近的检测记录
     * 
     * @param offset 偏移量
     * @param limit 限制数量
     * @return 检测日志列表
     */
    List<FaceDetectionLog> selectRecentDetections(@Param("offset") int offset,
                                                  @Param("limit") int limit);
    
    /**
     * 删除指定时间之前的日志记录
     * 
     * @param cutoffTime 截止时间
     * @return 影响行数
     */
    int deleteByDetectionTimeBefore(@Param("cutoffTime") LocalDateTime cutoffTime);
    
    /**
     * 更新检测日志
     * 
     * @param faceDetectionLog 检测日志
     * @return 影响行数
     */
    int update(FaceDetectionLog faceDetectionLog);
    
    /**
     * 删除检测日志
     * 
     * @param id 日志ID
     * @return 影响行数
     */
    int deleteById(@Param("id") Long id);
    
    /**
     * 查询所有检测日志
     * 
     * @return 检测日志列表
     */
    List<FaceDetectionLog> selectAll();
}
